home *** CD-ROM | disk | FTP | other *** search
/ Almathera Ten Pack 3: CDPD 3 / Almathera Ten on Ten - Disc 3: CDPD3.iso / ab20 / unarced / graphics / anim / putanim.c < prev    next >
C/C++ Source or Header  |  1995-03-17  |  4KB  |  162 lines

  1.  
  2. /* putanim.c
  3.  *   opens an animation iff file by outputing the starting
  4.  *   bitmap.  Then successive change frames may be output
  5.  *   followed by closing the file.
  6.  *
  7.  *   written by G. Bonham      May 1986
  8.  *              SPARTA, Inc.
  9.  *              Laguna Hills, Calif
  10.  */
  11.  
  12. #include "intuall.h"
  13. #include "gio.h"
  14. #include "ilbm.h"
  15. #include "putanim.h"
  16. #include "functions.h"
  17. #include "stdio.h"
  18.  
  19. #define BODY_BUFSIZE 512
  20. #define MaxDepth 5
  21.  
  22. #define CkErr(exp) {if(ifferror==IFF_OKAY)ifferror=(exp);}
  23.  
  24. extern UBYTE BMmask;
  25. extern int Pop;
  26. GroupContext fileC, form1C, form2C;
  27. static IFFP ifferror = 0;
  28. BYTE *Bufsave;
  29. LONG Bufsizesave;
  30. static UWORD bHw,bHh;
  31. static WORD bHx,bHy;
  32.  
  33. /* =================================================== */
  34.  
  35. BOOL OpenAnim(file,bm,pageW,pageH,colorMap,modes,buffer,bufsize)
  36. UWORD modes;
  37. LONG file;
  38. struct BitMap *bm;
  39. WORD pageW,pageH;
  40. WORD *colorMap;
  41. BYTE *buffer;  LONG bufsize;
  42. {
  43.    UBYTE depth;
  44.    BitMapHeader bmHdr;
  45.    ULONG lmodes;
  46.  
  47.    lmodes = modes;
  48.    ifferror = InitBMHdr(&bmHdr,bm,(WORD)mskNone,(WORD)cmpByteRun1
  49.                  ,0,pageW,pageH);
  50.  
  51.    if(ifferror != IFF_OKAY) printf("iff error: %d\n",ifferror);
  52.    if (ifferror == IFF_OKAY && bufsize > 2 * BODY_BUFSIZE) {
  53.       if (GWriteDeclare(file,buffer+BODY_BUFSIZE
  54.                 ,(long)(bufsize-BODY_BUFSIZE)) < 0)
  55.          ifferror = DOS_ERROR;
  56.       bufsize = BODY_BUFSIZE;
  57.    }
  58.  
  59.    depth = bm->Depth;
  60.    if (depth > 5) depth = 5;
  61.    CkErr(OpenWIFF(file,&fileC,(long)szNotYetKnown));
  62.    CkErr(StartWGroup(&fileC,(ID)FORM,(long)szNotYetKnown,ID_ANIM,&form1C));
  63.       CkErr(StartWGroup(&form1C,(ID)FORM,(long)szNotYetKnown,ID_ILBM,&form2C));
  64.          CkErr(PutCk(&form2C,ID_BMHD,(long)sizeof(BitMapHeader),(BYTE *)&bmHdr));
  65.          if (colorMap) CkErr(PutCMAP(&form2C,colorMap,depth));
  66.          CkErr(PutCk(&form2C,ID_CAMG,(long)sizeof(CamgChunk),(BYTE *)&lmodes));
  67.          CkErr(PutBODY(&form2C,bm,(long)NULL,&bmHdr,buffer,(long)bufsize));
  68.       CkErr(EndWGroup(&form2C));
  69.    CkErr(CloseWGroup(&form1C));
  70.    if(ifferror != IFF_OKAY) printf("openanim - iff error: %d\n",ifferror);
  71.    return((BOOL)(ifferror != IFF_OKAY));
  72. }
  73.  
  74. BOOL AddAnim(bm,pageW,pageH,pop,buffer,bufsize)
  75.  
  76. struct BitMap *bm;
  77. WORD pageW,pageH,pop;
  78. BYTE *buffer;
  79. LONG bufsize;
  80.  
  81. {
  82.    AnimationHeader animHdr;
  83.    BitMapHeader bmHdr;
  84.  
  85.       /* InitBMHdr sets w and h and x and y in bmHdr */
  86.       Pop = pop;
  87.       ifferror = InitBMHdr(&bmHdr,bm,(WORD)mskNone,(WORD)cmpByteRun1
  88.                 ,0,pageW,pageH);
  89.       bHx = bmHdr.x;
  90.       bHy = bmHdr.y;
  91.       bHw = bmHdr.w;
  92.       bHh = bmHdr.h;
  93.  
  94.       ifferror = InitAnimHdr(&animHdr,pop);
  95.       if(ifferror != IFF_OKAY) printf("iff error: %d\n",ifferror);
  96.  
  97.    CkErr(OpenWGroup(&fileC,&form1C));
  98.       CkErr(StartWGroup(&form1C,(ID)FORM,(long)szNotYetKnown,ID_ILBM,&form2C));
  99.          CkErr(PutCk(&form2C,ID_ANHD,(long)sizeof(AnimationHeader),(BYTE *)&animHdr));
  100.          CkErr(PutBODY(&form2C,bm,(long)NULL,&bmHdr,buffer,(long)bufsize));
  101.       CkErr(EndWGroup(&form2C));
  102.    CkErr(CloseWGroup(&form1C));
  103.    if(ifferror != IFF_OKAY) printf("addanim - iff error: %d\n",ifferror);
  104.    return((BOOL)(ifferror != IFF_OKAY));
  105. }
  106.  
  107. BOOL AddAnim2(data,ndata,pop)
  108. int pop;
  109. LONG *data;
  110. LONG ndata;
  111. {
  112.    AnimationHeader animHdr;
  113.  
  114.    ifferror = InitAnimHdr(&animHdr,pop);
  115.    if(ifferror != IFF_OKAY) printf("iff error: %d\n",ifferror);
  116.  
  117.    CkErr(OpenWGroup(&fileC,&form1C));
  118.       CkErr(StartWGroup(&form1C,(ID)FORM,(long)szNotYetKnown,ID_ILBM,&form2C));
  119.          CkErr(PutCk(&form2C,ID_ANHD,(long)sizeof(AnimationHeader),(BYTE *)&animHdr));
  120.          CkErr(PutCk(&form2C,ID_DLTA,ndata,data));
  121.       CkErr(EndWGroup(&form2C));
  122.    CkErr(CloseWGroup(&form1C));
  123.    if(ifferror != IFF_OKAY) printf("addanim - iff error: %d\n",ifferror);
  124.    return((BOOL)(ifferror != IFF_OKAY));
  125. }
  126.  
  127. BOOL CloseAnim(file)
  128.  
  129. LONG file;
  130.  
  131. {
  132.    Pop = 0;
  133.    CkErr(PutCkEnd(&fileC));
  134.    CkErr(CloseWGroup(&fileC));
  135.    if (GWriteUndeclare(file) < 0 && ifferror == IFF_OKAY) ifferror = DOS_ERROR;
  136.    return ((BOOL)(ifferror != IFF_OKAY));
  137. }
  138.  
  139. BOOL InitAnimHdr(aH,op)
  140. AnimationHeader *aH;
  141. WORD op;
  142.  
  143. {
  144.    int i;
  145.  
  146.    aH->operation = op;
  147.    aH->mask = 0;
  148.    aH->x = 0;
  149.    aH->y = 0;
  150.    aH->w = 0;
  151.    aH->h = 0;
  152.    aH->interleave = 0;
  153.    aH->reltime = 0;
  154.    aH->abstime = 0;
  155.    aH->bits = 0;
  156.    aH->pad0 = 0;
  157.    for (i=0;i<16;i++) aH->pad[i] = 0;
  158.    return(0);
  159.  
  160. }
  161.  
  162.